import type { 
  IApiResponse, 
  IApiPaginatedResponse, 
  IBatchRequest, 
  IBatchResponse
} from '../common/api';
import type { IPaginatedQuery } from '../common/pagination';
import type { 
  IScheduleTemplate, 
  IScheduleTemplateCreateRequest, 
  IScheduleTemplateUpdateRequest, 
  IScheduleTemplateQueryParams,
  IScheduleTemplateStatistics,
  IScheduleTemplateSummary,
  IScheduleTemplateDetail,
  IScheduleTemplateBatchRequest,
  IScheduleTemplateBatchResponse
} from './scheduleTemplate';
import type {
  IScheduleInstance,
  IScheduleInstanceCreateRequest,
  IScheduleInstanceUpdateRequest,
  IScheduleInstanceQueryParams,
  IScheduleInstanceStatistics,
  IScheduleInstanceSummary,
  IScheduleInstanceDetail,
  IScheduleInstanceBatchRequest,
  IScheduleInstanceBatchResponse,
  IScheduleInstanceConflict
} from './scheduleInstance';

// ==================== 课程安排模板相关 API 类型 ====================

/**
 * 获取课程安排模板列表 API 响应
 * @description 分页获取课程安排模板列表的响应类型
 */
export type IGetScheduleTemplatesResponse = IApiPaginatedResponse<IScheduleTemplate>;

/**
 * 获取课程安排模板详情 API 响应
 * @description 获取单个课程安排模板详情的响应类型
 */
export type IGetScheduleTemplateResponse = IApiResponse<IScheduleTemplateDetail>;

/**
 * 创建课程安排模板 API 响应
 * @description 创建课程安排模板的响应类型
 */
export type ICreateScheduleTemplateResponse = IApiResponse<IScheduleTemplate>;

/**
 * 更新课程安排模板 API 响应
 * @description 更新课程安排模板信息的响应类型
 */
export type IUpdateScheduleTemplateResponse = IApiResponse<IScheduleTemplate>;

/**
 * 删除课程安排模板 API 响应
 * @description 删除课程安排模板的响应类型
 */
export type IDeleteScheduleTemplateResponse = IApiResponse<{ id: string }>;

/**
 * 获取课程安排模板统计 API 响应
 * @description 获取课程安排模板统计信息的响应类型
 */
export type IGetScheduleTemplateStatisticsResponse = IApiResponse<IScheduleTemplateStatistics>;

/**
 * 获取课程安排模板简要列表 API 响应
 * @description 获取课程安排模板简要信息列表的响应类型
 */
export type IGetScheduleTemplateSummariesResponse = IApiResponse<IScheduleTemplateSummary[]>;

/**
 * 课程安排模板查询请求参数
 * @description 查询课程安排模板列表的请求参数
 */
export type IScheduleTemplateListRequest = IPaginatedQuery<IScheduleTemplateQueryParams>;

/**
 * 批量课程安排模板操作响应
 * @description 批量操作课程安排模板的响应类型
 */
export type IScheduleTemplateBatchOperationResponse = IApiResponse<IScheduleTemplateBatchResponse>;

// ==================== 课程实例相关 API 类型 ====================

/**
 * 获取课程实例列表 API 响应
 * @description 分页获取课程实例列表的响应类型
 */
export type IGetScheduleInstancesResponse = IApiPaginatedResponse<IScheduleInstance>;

/**
 * 获取课程实例详情 API 响应
 * @description 获取单个课程实例详情的响应类型
 */
export type IGetScheduleInstanceResponse = IApiResponse<IScheduleInstanceDetail>;

/**
 * 创建课程实例 API 响应
 * @description 创建课程实例的响应类型
 */
export type ICreateScheduleInstanceResponse = IApiResponse<IScheduleInstance>;

/**
 * 更新课程实例 API 响应
 * @description 更新课程实例信息的响应类型
 */
export type IUpdateScheduleInstanceResponse = IApiResponse<IScheduleInstance>;

/**
 * 删除课程实例 API 响应
 * @description 删除课程实例的响应类型
 */
export type IDeleteScheduleInstanceResponse = IApiResponse<{ id: string }>;

/**
 * 获取课程实例统计 API 响应
 * @description 获取课程实例统计信息的响应类型
 */
export type IGetScheduleInstanceStatisticsResponse = IApiResponse<IScheduleInstanceStatistics>;

/**
 * 获取课程实例简要列表 API 响应
 * @description 获取课程实例简要信息列表的响应类型
 */
export type IGetScheduleInstanceSummariesResponse = IApiResponse<IScheduleInstanceSummary[]>;

/**
 * 课程实例查询请求参数
 * @description 查询课程实例列表的请求参数
 */
export type IScheduleInstanceListRequest = IPaginatedQuery<IScheduleInstanceQueryParams>;

/**
 * 批量课程实例操作响应
 * @description 批量操作课程实例的响应类型
 */
export type IScheduleInstanceBatchOperationResponse = IApiResponse<IScheduleInstanceBatchResponse>;

// ==================== 课程安排业务相关 API 类型 ====================

/**
 * 生成课程实例请求
 * @description 根据模板生成课程实例的请求参数
 */
export interface IGenerateScheduleInstancesRequest {
  /** 模板ID */
  templateId: string;
  /** 是否覆盖已存在的实例 */
  overwrite?: boolean;
  /** 生成范围 - 开始日期 */
  startDate?: string;
  /** 生成范围 - 结束日期 */
  endDate?: string;
  /** 最大生成数量 */
  maxCount?: number;
}

/**
 * 生成课程实例响应
 * @description 根据模板生成课程实例的响应类型
 */
export interface IGenerateScheduleInstancesResponse {
  /** 生成的实例数量 */
  generatedCount: number;
  /** 跳过的实例数量 */
  skippedCount: number;
  /** 生成的实例列表 */
  instances: IScheduleInstance[];
  /** 跳过的日期列表 */
  skippedDates: string[];
  /** 冲突信息 */
  conflicts?: IScheduleInstanceConflict[];
}

/**
 * 生成课程实例 API 响应
 * @description 生成课程实例的 API 响应类型
 */
export type IGenerateScheduleInstancesApiResponse = IApiResponse<IGenerateScheduleInstancesResponse>;

/**
 * 检查时间冲突请求
 * @description 检查课程安排时间冲突的请求参数
 */
export interface ICheckScheduleConflictRequest {
  /** 学生ID */
  studentId: string;
  /** 日期 */
  date: string;
  /** 开始时间 */
  startTime: string;
  /** 结束时间 */
  endTime: string;
  /** 排除的实例ID（编辑时使用） */
  excludeInstanceId?: string;
  /** 排除的模板ID（编辑时使用） */
  excludeTemplateId?: string;
}

/**
 * 检查时间冲突响应
 * @description 检查课程安排时间冲突的响应数据
 */
export interface ICheckScheduleConflictResponse {
  /** 是否有冲突 */
  hasConflict: boolean;
  /** 冲突列表 */
  conflicts: IScheduleInstanceConflict[];
  /** 冲突描述 */
  message?: string;
}

/**
 * 检查时间冲突 API 响应
 * @description 检查时间冲突的 API 响应类型
 */
export type ICheckScheduleConflictApiResponse = IApiResponse<ICheckScheduleConflictResponse>;

/**
 * 获取混合课表请求
 * @description 获取多学生混合课表的请求参数
 */
export interface IGetMixedScheduleRequest {
  /** 学生ID列表 */
  studentIds: string[];
  /** 日期范围 - 开始日期 */
  startDate: string;
  /** 日期范围 - 结束日期 */
  endDate: string;
  /** 视图类型 */
  viewType?: 'day' | 'week' | 'month';
  /** 是否包含已取消的课程 */
  includeCancelled?: boolean;
  /** 是否包含补课 */
  includeMakeup?: boolean;
}

/**
 * 混合课表数据
 * @description 混合课表的数据结构
 */
export interface IMixedScheduleData {
  /** 时间段列表 */
  timeSlots: string[];
  /** 日期列表 */
  dates: string[];
  /** 课程实例矩阵 */
  scheduleMatrix: Record<string, Record<string, IScheduleInstanceSummary[]>>;
  /** 学生信息 */
  students: Array<{
    id: string;
    name: string;
    color: string;
  }>;
  /** 冲突信息 */
  conflicts: IScheduleInstanceConflict[];
}

/**
 * 获取混合课表 API 响应
 * @description 获取混合课表的 API 响应类型
 */
export type IGetMixedScheduleResponse = IApiResponse<IMixedScheduleData>;

/**
 * 课程安排导入请求
 * @description 批量导入课程安排数据的请求参数
 */
export interface IScheduleImportRequest {
  /** 导入的模板数据列表 */
  templates: IScheduleTemplateCreateRequest[];
  /** 是否自动生成实例 */
  autoGenerateInstances?: boolean;
  /** 是否覆盖已存在的安排 */
  overwrite?: boolean;
  /** 导入模式 */
  mode?: 'create' | 'update' | 'upsert';
}

/**
 * 课程安排导入响应
 * @description 批量导入课程安排数据的响应类型
 */
export interface IScheduleImportResponse {
  /** 成功导入的模板数量 */
  successTemplateCount: number;
  /** 失败的模板数量 */
  failedTemplateCount: number;
  /** 生成的实例数量 */
  generatedInstanceCount: number;
  /** 成功导入的模板列表 */
  successTemplates: IScheduleTemplate[];
  /** 失败的模板信息 */
  failedTemplates: Array<{
    template: IScheduleTemplateCreateRequest;
    reason: string;
  }>;
  /** 生成的实例列表 */
  generatedInstances: IScheduleInstance[];
}

/**
 * 课程安排导出请求
 * @description 导出课程安排数据的请求参数
 */
export interface IScheduleExportRequest {
  /** 导出类型 */
  type: 'templates' | 'instances' | 'both';
  /** 导出的学生ID列表，为空则导出所有 */
  studentIds?: string[];
  /** 导出的课程ID列表，为空则导出所有 */
  courseIds?: string[];
  /** 日期范围 - 开始日期 */
  startDate?: string;
  /** 日期范围 - 结束日期 */
  endDate?: string;
  /** 导出格式 */
  format?: 'json' | 'csv' | 'excel' | 'ical';
  /** 导出字段 */
  fields?: string[];
  /** 筛选条件 */
  filters?: {
    templateFilters?: IScheduleTemplateQueryParams;
    instanceFilters?: IScheduleInstanceQueryParams;
  };
}

/**
 * 课程提醒设置请求
 * @description 设置课程提醒的请求参数
 */
export interface IScheduleReminderRequest {
  /** 模板ID列表 */
  templateIds: string[];
  /** 提醒设置 */
  reminderSettings: {
    /** 是否启用提醒 */
    enabled: boolean;
    /** 提前提醒时间（分钟） */
    advanceMinutes: number;
    /** 提醒方式 */
    methods: ('notification' | 'email' | 'sms')[];
  };
}

/**
 * 课程提醒设置 API 响应
 * @description 设置课程提醒的 API 响应类型
 */
export type IScheduleReminderResponse = IApiResponse<{
  updatedTemplateIds: string[];
  message: string;
}>;